package de.gof.ppstool.lagerverwaltung.db;

import java.io.Serializable;
import javax.persistence.*;
import de.gof.ppstool.bestellverwaltung.db.BestellpositionEntity;
import de.gof.ppstool.fertigungsverwaltung.db.Fertigungsauftragsposition;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * The persistent class for the teil database table.
 */
@Entity
@NamedQueries({
		@NamedQuery(name = Teil.FINDE_ALLE_TEILE, query = "SELECT DISTINCT t FROM Teil t"),
		@NamedQuery(name = Teil.FINDE_TEIL_NACH_TEIL_ID, query = "SELECT DISTINCT t FROM Teil t WHERE t.teilId = :"
				+ Teil.PARAM_TEIL_ID),
		@NamedQuery(name = Teil.FINDE_TEIL_NACH_ART, query = "SELECT DISTINCT t FROM Teil t WHERE t.teileart = :"
				+ Teil.PARAM_TEIL_TEILART) })
@Table(name = "teil")
public class Teil implements Serializable, Comparable<Teil> {
	private static final long serialVersionUID = 468533497195890874L;
	static final String FINDE_ALLE_TEILE = "findeAlleTeile";
	static final String FINDE_TEIL_NACH_ART = "findeTeilNachArt";
	static final String FINDE_TEIL_NACH_TEIL_ID = "findeTeilNachTeilId";
	static final String PARAM_TEIL_ID = "teil_id";
	static final String PARAM_TEIL_TEILART = "teileart";
	/**
	 * +++++++++++++++++++++++++++++++++++
	 * +++++ Attribute der Klasse Teil +++
	 * +++++++++++++++++++++++++++++++++++
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "teil_sequence_name")
	@SequenceGenerator(name = "teil_sequence_name", sequenceName = "teil_teil_id_seq", allocationSize = 1)
	@Column(name = "teil_id", unique = true, nullable = false)
	private Long teilId;
	@Column(nullable = false, length = 2147483647)
	private String bezeichnung;
	@Column(nullable = false, length = 2147483647)
	private String abweichung;
	@Column(length = 2147483647)
	private String baugruppe;
	@Column(nullable = false, length = 2147483647)
	private Double bestellkosten;
	@Column(length = 2147483647)
	private Integer bestellteMenge;
	@Column(nullable = false, length = 2147483647)
	private String herstellzeit;
	@OneToOne
	@JoinColumn(name = "inbearbeitung")
	private Arbeitsplatz inBearbeitung;
	@ManyToOne
	@JoinColumn(name = "inwarteschlange")
	private Arbeitsplatz inWarteschlange;
	@Column(nullable = false, length = 2147483647)
	private Integer lagerbestand;
	@Column(nullable = false, length = 2147483647)
	private Double preis;
	@Column(length = 2147483647)
	private String rabattmenge;
	@Column(length = 2147483647)
	private Integer sicherheitsbestand;
	@Column(nullable = false, length = 2147483647)
	private String teileart;
	@Column(nullable = false, length = 2147483647)
	private String wiederbeschaffungszeit;
	@Column(nullable = false, length = 2147483647)
	private String fahrradkategorie;
	@Column(length = 2147483647)
	private String verkaufspreis;
	//bi-directional many-to-one association to Fertigungsauftragsposition
	@OneToMany(mappedBy = "teil")
	private List<Fertigungsauftragsposition> fertigungsauftragspositionen;
	//bi-directional many-to-many association to Bestellposition
	@OneToOne
	@JoinColumn(name = "bestellposition_id")
	private BestellpositionEntity bestellposition;
	@Column(length = 2147483647)
	private String benoetigteMenge;
	@Column(length = 2147483647)
	private Integer zuBestellendeMenge;
	@Column
	private String dispositivVerfuegbarerBestand;
	@Column
	private String reichweiteDispositivVerfuegbarerBestand;
	@Column
	private String ReichweiteLieferzeit;
	@Column
	private String offeneBestellmenge;
	@Transient
	private boolean eilbestellung;
	@Column
	private String prognosePn1;
	@Column
	private String prognosePn2;
	@Column
	private String prognosePn3;
	/**
	 * String: Periodenkennung
	 * Integer: Menge
	 */
	@Transient
	public Map<String, Integer> offeneBestellungen = new HashMap<String, Integer>();
	@Transient
	private boolean bestellungNotwendig;

	/**
	 * +++++++++++++++++++++++++++++++++++++++
	 * +++++ Konstruktoren der Klasse Teil +++
	 * +++++++++++++++++++++++++++++++++++++++
	 */
	public Teil() {
		super();
	}

	public Teil(Long teilId, String abweichung, String baugruppe,
			Double bestellkosten, Integer bestellteMenge, String herstellzeit,
			Arbeitsplatz inBearbeitung, Arbeitsplatz inWarteschlange,
			Integer lageberbestand, Double preis, String rabattmenge,
			Integer sicherheitsbestand, String teileart,
			String wiederbeschaffungszeit,
			List<Fertigungsauftragsposition> fertigungsauftragspositionen,
			BestellpositionEntity bestellposition, String verkaufspreis,
			String fahrradkategorie) {
		super();
		this.teilId = teilId;
		this.abweichung = abweichung;
		this.baugruppe = baugruppe;
		this.bestellkosten = bestellkosten;
		this.bestellteMenge = bestellteMenge;
		this.herstellzeit = herstellzeit;
		this.inBearbeitung = inBearbeitung;
		this.inWarteschlange = inWarteschlange;
		this.lagerbestand = lageberbestand;
		this.preis = preis;
		this.rabattmenge = rabattmenge;
		this.sicherheitsbestand = sicherheitsbestand;
		this.teileart = teileart;
		this.wiederbeschaffungszeit = wiederbeschaffungszeit;
		this.fertigungsauftragspositionen = fertigungsauftragspositionen;
		this.bestellposition = bestellposition;
		this.verkaufspreis = verkaufspreis;
		this.fahrradkategorie = fahrradkategorie;
	}

	/**
	 * +++++++++++++++++++++++++++++	
	 * +++++ Getter und Setter +++++
	 * +++++++++++++++++++++++++++++
	 */
	public Long getTeilId() {
		return this.teilId;
	}

	public void setTeil_id(Long teil_id) {
		this.teilId = teil_id;
	}

	public void setBezeichnung(String bezeichnung) {
		this.bezeichnung = bezeichnung;
	}

	public String getBezeichnung() {
		return bezeichnung;
	}

	public String getAbweichung() {
		return this.abweichung;
	}

	public void setAbweichung(String abweichung) {
		this.abweichung = abweichung;
	}

	public String getBaugruppe() {
		return this.baugruppe;
	}

	public void setBaugruppe(String baugruppe) {
		this.baugruppe = baugruppe;
	}

	public Double getBestellkosten() {
		return this.bestellkosten;
	}

	public void setBestellkosten(Double bestellkosten) {
		this.bestellkosten = bestellkosten;
	}

	public Integer getBestelltemenge() {
		return this.bestellteMenge;
	}

	public void setBestelltemenge(Integer bestellteMenge) {
		this.bestellteMenge = bestellteMenge;
	}

	public String getHerstellzeit() {
		return this.herstellzeit;
	}

	public void setHerstellzeit(String herstellzeit) {
		this.herstellzeit = herstellzeit;
	}

	public Arbeitsplatz getInbearbeitung() {
		return this.inBearbeitung;
	}

	public void setInbearbeitung(Arbeitsplatz inBearbeitung) {
		this.inBearbeitung = inBearbeitung;
	}

	public Arbeitsplatz getInwarteschlange() {
		return this.inWarteschlange;
	}

	public void setInwarteschlange(Arbeitsplatz inWarteschlange) {
		this.inWarteschlange = inWarteschlange;
	}

	public Integer getLagerbestand() {
		return this.lagerbestand;
	}

	public void setLagerbestand(Integer lagerbestand) {
		this.lagerbestand = lagerbestand;
	}

	public Double getPreis() {
		return this.preis;
	}

	public void setPreis(Double preis) {
		this.preis = preis;
	}

	public String getRabattmenge() {
		return this.rabattmenge;
	}

	public void setRabattmenge(String rabattmenge) {
		this.rabattmenge = rabattmenge;
	}

	public Integer getSicherheitsbestand() {
		return this.sicherheitsbestand;
	}

	public void setSicherheitsbestand(Integer sicherheitsbestand) {
		this.sicherheitsbestand = sicherheitsbestand;
	}

	public String getTeileart() {
		return this.teileart;
	}

	public void setTeileart(String teileart) {
		this.teileart = teileart;
	}

	public String getWiederbeschaffungszeit() {
		return this.wiederbeschaffungszeit;
	}

	public void setWiederbeschaffungszeit(String wiederbeschaffungszeit) {
		this.wiederbeschaffungszeit = wiederbeschaffungszeit;
	}

	public List<Fertigungsauftragsposition> getFertigungsauftragspositions() {
		return this.fertigungsauftragspositionen;
	}

	public void setFertigungsauftragspositions(
			List<Fertigungsauftragsposition> fertigungsauftragspositionen) {
		this.fertigungsauftragspositionen = fertigungsauftragspositionen;
	}

	public BestellpositionEntity getBestellposition() {
		return this.bestellposition;
	}

	public void setBestellposition(BestellpositionEntity bestellposition) {
		this.bestellposition = bestellposition;
	}

	public String getFahrradkategorie() {
		return this.fahrradkategorie;
	}

	public void setFahrradkategorie(String fahrradkategorie) {
		this.fahrradkategorie = fahrradkategorie;
	}

	public String getVerkaufspreis() {
		return this.verkaufspreis;
	}

	public void setVerkaufspreis(String verkaufspreis) {
		this.verkaufspreis = verkaufspreis;
	}

	public void setBenoetigteMenge(String benoetigteMenge) {
		this.benoetigteMenge = benoetigteMenge;
	}

	public String getBenoetigteMenge() {
		return benoetigteMenge;
	}

	public void setDispositivVerfuegbarerBestand(
			String dispositivVerfuegbarerBestand) {
		this.dispositivVerfuegbarerBestand = dispositivVerfuegbarerBestand;
	}

	public String getDispositivVerfuegbarerBestand() {
		return dispositivVerfuegbarerBestand;
	}

	public void setReichweiteDispositivVerfuegbarerBestand(
			String reichweiteDispositivVerfuegbarerBestand) {
		this.reichweiteDispositivVerfuegbarerBestand = reichweiteDispositivVerfuegbarerBestand;
	}

	public String getReichweiteDispositivVerfuegbarerBestand() {
		return reichweiteDispositivVerfuegbarerBestand;
	}

	public void setReichweiteLieferzeit(String reichweiteLieferzeit) {
		ReichweiteLieferzeit = reichweiteLieferzeit;
	}

	public String getReichweiteLieferzeit() {
		return ReichweiteLieferzeit;
	}

	public void setOffeneBestellungen(Map<String, Integer> offeneBestellungen) {
		this.offeneBestellungen = offeneBestellungen;
	}

	public Map<String, Integer> getOffeneBestellungen() {
		return offeneBestellungen;
	}

	public void setOffeneBestellmenge(String offeneBestellmenge) {
		this.offeneBestellmenge = offeneBestellmenge;
	}

	public String getOffeneBestellmenge() {
		return offeneBestellmenge;
	}

	public void setBestellungNotwendig(boolean bestellungNotwendig) {
		this.bestellungNotwendig = bestellungNotwendig;
	}

	public boolean isBestellungNotwendig() {
		return bestellungNotwendig;
	}

	public void setZuBestellendeMenge(Integer zuBestellendeMenge) {
		this.zuBestellendeMenge = zuBestellendeMenge;
	}

	public Integer getZuBestellendeMenge() {
		return zuBestellendeMenge;
	}

	/**
	 * @param prognosePn1  the prognosePn1 to set
	 */
	public void setPrognosePn1(String prognosePn1) {
		this.prognosePn1 = prognosePn1;
	}

	/**
	 * @return  the prognosePn1
	 */
	public String getPrognosePn1() {
		return prognosePn1;
	}

	/**
	 * @param prognosePn2  the prognosePn2 to set
	 */
	public void setPrognosePn2(String prognosePn2) {
		this.prognosePn2 = prognosePn2;
	}

	/**
	 * @return  the prognosePn2
	 */
	public String getPrognosePn2() {
		return prognosePn2;
	}

	/**
	 * @param prognosePn3  the prognosePn3 to set
	 */
	public void setPrognosePn3(String prognosePn3) {
		this.prognosePn3 = prognosePn3;
	}

	/**
	 * @return  the prognosePn3
	 */
	public String getPrognosePn3() {
		return prognosePn3;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((bezeichnung == null) ? 0 : bezeichnung.hashCode());
		result = prime * result + ((teilId == null) ? 0 : teilId.hashCode());
		result = prime * result
				+ ((teileart == null) ? 0 : teileart.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;

		if (obj == null)
			return false;

		if (getClass() != obj.getClass())
			return false;

		Teil other = (Teil) obj;
		if (bezeichnung == null) {
			if (other.bezeichnung != null)
				return false;

		} else if (!bezeichnung.equals(other.bezeichnung))
			return false;

		if (teilId == null) {
			if (other.teilId != null)
				return false;

		} else if (!teilId.equals(other.teilId))
			return false;

		if (teileart == null) {
			if (other.teileart != null)
				return false;

		} else if (!teileart.equals(other.teileart))
			return false;

		return true;
	}

	@Override
	public String toString() {
		return "Teil [teilId=" + teilId + ", baugruppe=" + baugruppe
				+ ", bestellkosten=" + bestellkosten + ", bestellteMenge="
				+ bestellteMenge + ", bezeichnung=" + bezeichnung
				+ ", fahrradkategorie=" + fahrradkategorie + ", herstellzeit="
				+ herstellzeit + ", lagerbestand=" + lagerbestand + ", preis="
				+ preis + ", rabattmenge=" + rabattmenge
				+ ", sicherheitsbestand=" + sicherheitsbestand
				+ ", abweichung=" + abweichung + ", teileart=" + teileart
				+ ", verkaufspreis=" + verkaufspreis
				+ ", wiederbeschaffungszeit=" + wiederbeschaffungszeit
				+ ",benoetigteTeile=" + benoetigteMenge + "]";
	}

	public void setEilbestellung(boolean eilbestellung) {
		this.eilbestellung = eilbestellung;
	}

	public boolean isEilbestellung() {
		return eilbestellung;
	}

	@Override
	public int compareTo(Teil teil) {
		if (this.getTeilId() < teil.getTeilId()) {
			return -1;
		} else if (this.getTeilId() == teil.getTeilId()) {
			return 0;
		} else if (this.getTeilId() > teil.getTeilId()) {
			return 1;
		} else {
			//TODO: Exception werfen?
			return -1;
		}

	}

}
